// 计算给定二叉树的所有左叶子之和。

// 暴露接口
function sumOfLeftLeaves(root: TreeNode | null): number {
    let sum: number = 0;
    // 深度优先遍历辅助方法
    const sumOfLeftLeaves_DFS = function (root: TreeNode | null, isLeft: boolean) {
        // 递归出口
        if (root == null) {
            return;
        }
        // 如果当前节点是左子数叶节点，则增加sum
        if (root.left == null && root.right == null && isLeft) {
            sum += root.val;
        }
        // 对左右子树搜索
        sumOfLeftLeaves_DFS(root.left, true);
        sumOfLeftLeaves_DFS(root.right, false);
    };
    // 调用方法
    sumOfLeftLeaves_DFS(root, false);
    return sum;
};



// 这道题是一道考虑递归设计的题目，
// 首先记录sum很简单，因为是一个基础数据类型，我们可以让它作为外层变量
// 然后通过作用域链来访问到
// 叶子节点的访问是一个老生长谈的问题，我们使用深度优先遍历即可
// 这道题需要考虑的点在于当我们访问到当前的叶子节点时，
// 我们怎么知道是在左子树还是在右子树上？
// 显然是不知道的，我们需要在每层递归前，提供一个布尔变量来判断下一轮递归进行是左右子树中的哪个
// 当获得了递归的运行时信息之后，这道题应该就迎刃而解了。